// 1.  定义一个Promise构造函数，传入`excutor`执行器函数
// function Promise(excutor){
//     // 2. 在构造函数内定义2个属性
//     //    1. `this.PromiseState` 保存promise状态
//     //    2. `this.PromiseResult`保存promise结果值
//     this.PromiseState = "pending";
//     this.PromiseResult = undefined;

//     // 3. 定义resolve、reject函数
//     //    1. 在resolve函数内修改`this.PromiseState` 为`fulfilled`，`this.PromiseResult`为value
//     //    2. 在reject函数内修改`this.PromiseState`为 `rejected`,`this.PromiseResult` 为 reason
//     let resolve = (value)=>{
//         this.PromiseState = 'fulfilled';
//         this.PromiseResult = value;
//     }
//     let reject = (reason)=>{
//         this.PromiseState = 'rejected';
//         this.PromiseResult = reason;
//     }

//      // 4. 调用`excutor`函数并传入resolve、reject函数
//      // 5. try捕获执行`excutor`函数时抛出错误
//         //    1. catch 内调用reject函数并传入err参数
//     try{
//      excutor(resolve,reject);
//     }catch(err){
//         reject(err)
//     }
// }

function Promise(excutor) {
    // 声明两个属性
    this.PromiseState = 'pendding';
    this.PromiseResult = undefined;
    // 存的异步执行函数
    // [
    //     {
    //         ok:function(){
    //             ...
    //         },
    //         err:function(){

    //         }
    //     },
    //     {
    //         ok:function(){
    //             ...
    //         },
    //         err:function(){
                
    //         }
    //     },
    //     {
    //         ok:function(){
    //             ...
    //         },
    //         err:function(){
                
    //         }
    //     }
    // ]
    this.callBack = [];
    let res = (val)=>{
        // console.log("123");
        // console.log(this);
        this.PromiseState = 'fulfilled';
        this.PromiseResult = val;

        // 注定是成功了
        this.callBack.forEach(item=>{
            item.ok(val);
        })
    }
    let rej = (rea)=>{
        this.PromiseState = 'rejected';
        this.PromiseResult = rea;

        // 注定失败了
        this.callBack.forEach(item=>{
            item.err(rea)
        })
    }
    try{
        excutor(res,rej)
    }catch(error){
        // console.log(error);
        rej(error)
    } 
}

// 1. 新建promise原型下then方法
Promise.prototype.then = function(onResolve,onReject){

    // 同步修改状态
    // console.log(this.PromiseResult);
    // 判断成功与否 - this.PromiseState
    if(this.PromiseState==='fulfilled'){
        onResolve(this.PromiseResult);
    }

    if(this.PromiseState==='rejected'){
        onReject(this.PromiseResult)
    }
    
    // 异步修改状态处理方式
    if(this.PromiseState === 'pendding'){
        // 要么没改状态、要么异步修改状态
        // 可以先把要执行的函数 存起来，然后等着冬天过去了，咱们拿着种子去播种。
        // 1.存函数，2.在异步状态改变后执行。
        this.callBack.push({
            ok:onResolve,
            err:onReject
        })
    }

}


